package com.xls.boxlibrary.duihuanjibi;

import com.xls.commonlibrary.util.Base64Utils;

import java.io.IOException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;

import java.util.HashMap;

/**
 * @author qql
 *
 * java8可能抛出异常
 * java.security.InvalidKeyException: Illegal key size or default parameters(key大小或默认参数异常)
 *查到资料发现原来JDK是不支持AES的256加密的，官方网站上提供了扩展包叫无限制JCE策略文件，用于覆盖原有的
 * 两个jar包，就可以支持256加密了
 * 下载网址:
 * JDK7的下载地址: https://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
 * JDK8的下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
 * local_policy.jar和 US_export_policy.jar
 * 这两个jar的替换路径为:
 * 你的jdk所在路径/jre/lib/security，进去就能看到这两个jar包了。
 *
 *
 **/
public class Demo {
    /**
     * 密钥, 256位32个字节
     */
    public static final String comSecret = "8EUN7D69FIING2V92IGI7V8TWCI8LLS0";
    /**
     * 初始向量IV, 初始向量IV的长度规定为128位16个字节, 初始向量的来源为随机生成.
     */
    private static final String comKey = "2021062516283151";

    private static final String URL = "http://test.chonghai.net:8020";//测试地址（生产请更换:https://apiwx.huifubafang.com:9000)

    private static final String AES = "AES";


    /**
     * 加密解密算法/加密模式/填充方式
     */
    private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";



    static {
        java.security.Security.setProperty("crypto.policy", "unlimited");
    }

    /**
     * AES加密
     */
    public static String encode(String key, String content) {
        try {
            javax.crypto.SecretKey secretKey = new javax.crypto.spec.SecretKeySpec(key.getBytes(), AES);
            javax.crypto.Cipher cipher = javax.crypto.Cipher.getInstance(CIPHER_ALGORITHM);
            cipher.init(javax.crypto.Cipher.ENCRYPT_MODE, secretKey, new javax.crypto.spec.IvParameterSpec(comKey.getBytes()));

            // 获取加密内容的字节数组(这里要设置为utf-8)不然内容中如果有中文和英文混合中文就会解密为乱码
            byte[] byteEncode = content.getBytes(java.nio.charset.StandardCharsets.UTF_8);

            // 根据密码器的初始化方式加密
            byte[] byteAES = cipher.doFinal(byteEncode);

            // 将加密后的数据转换为字符串
            return Base64Utils.encodeToString(byteAES);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}